


package com.yupi.springbootinit.controller;


import com.google.gson.Gson;
import com.yupi.springbootinit.common.BaseResponse;
import com.yupi.springbootinit.common.ErrorCode;
import com.yupi.springbootinit.common.ResultUtils;
import com.yupi.springbootinit.exception.BusinessException;
import com.yupi.springbootinit.model.entity.Book;
import com.yupi.springbootinit.model.entity.CartItem;
import com.yupi.springbootinit.model.vo.CartVo;
import com.yupi.springbootinit.service.BookService;
import com.yupi.springbootinit.utils.JedisClient;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 在redis数据库中我们使用cart作为filed 以用户名作为key 购物车内容为value
 * @author wzh
 */


@Controller
@RequestMapping("cart")
public class CartController {


    @Resource
    private JedisClient jedisClient;

    private static final String REDIS_CART = "cart:";

    @Resource
    private BookService bookService;


    private Gson gson=new Gson();



/**
     * 商品加入到购物车
     * */

    @RequestMapping("/addProductToCart")
    @ResponseBody
    public void addProductToCart(@RequestParam("productId")Integer productId, @RequestParam(value = "nums",required = false)String nums){
        // todo 获取已登录的用户信息  校验当前的用户是否已经登录
           int userId=100;
        //  todo 获取商品信息
        Book book = bookService.getById(productId);
/**
         * 判断Product是否为空
         * */
        if (book==null){
            throw new RuntimeException("加入购物车的商品不存在");
        }
       // todo 校验库存是否足够
        if(book.getInventory()<=0){
          throw new BusinessException(ErrorCode.PARAMS_ERROR,"商品库存不足");
        }
        /**
         * 存在一个问题：当session超时后应该强制用户进行登入，只有登入成功才能做相应的操作
         */
//        判断购物车是否存在
        String key=REDIS_CART+userId;
        Boolean hexists = jedisClient.exists(key);
        System.out.println("hexists---->"+hexists);
        Boolean exit = jedisClient.hexists(key, productId.toString());
//        todo 为真说明商品已经被加入了购物车，则执行更新操作，在原来的基础上进行累加
        if (exit){
//            获取初始值
            String ite = jedisClient.hget(key, productId.toString());
//            手动反序列化
            CartItem cartItem = gson.fromJson(ite, CartItem.class);
            Integer res=Integer.valueOf(nums)+cartItem.getNumber();
            cartItem.setNumber(res);
            jedisClient.hset(key,productId.toString(),gson.toJson(cartItem));
        }else {
            CartItem item = CartItem.builder()
                    .price(book.getPrice())
                    .number(Integer.valueOf(nums)).build();
            try {
                jedisClient.hset(key,productId.toString(),gson.toJson(item));
            } catch (Exception e) {
              e.printStackTrace();
              throw new RuntimeException("加入购物车发生异常");
            }
        }
    }

/**
     *购物车信息展示到前台购物车页
     * */

    @RequestMapping("/fromCartShowProduct")
    @ResponseBody
    public BaseResponse<List<CartVo>> fromCartShowProduct(){
        //todo 获取已登录的用户信息
        int userId=100;
        List<CartVo> res=new ArrayList<>();

          /**
         * todo 存在一个问题：当session超时后因该强制用户进行登入，只有登入成功才能做相应的操作
         */

        String key=REDIS_CART+userId;
        Boolean hexists = jedisClient.exists(key);
        if(hexists){
//          todo 构建CartVo对象并返回
            Map<Object, Object> all = jedisClient.hgetall(key);
            Set<Object> keys = all.keySet();res = keys.stream().map(o -> {
//                   更具id查询商品信息
                CartVo cartVo = new CartVo();
                Book book = bookService.getById(Integer.valueOf(o.toString()));
                CartItem o1 = gson.fromJson( all.get(o.toString()).toString(),CartItem.class);
                BeanUtils.copyProperties(book, cartVo);
                cartVo.setNumber(o1.getNumber());
                return cartVo;
            }).collect(Collectors.toList());
            System.out.println(all);
            return ResultUtils.success(res);
        }else {
            return ResultUtils.success(res);
        }
    }

/*
*
     * 实现购物车页面通过+/-/输入 按钮来对商品的数量更新操作
     * */


/**
     * 删除购物车中某一个购物项
     * */

    @RequestMapping("/delCartProduct")
    @ResponseBody
    public void delCartProduct(@RequestParam("productId")Integer productId, @RequestParam("nums")String nums){
        //获取已登录的用户信息
        int userId=100;
        String key=REDIS_CART+userId;
        try {
            jedisClient.hdel(key,productId.toString());
        } catch (Exception e) {
           e.printStackTrace();
           throw new BusinessException(ErrorCode.SYSTEM_ERROR,"将商品移除的过程发生异常");
        }
    }




/*
*
     * 清空购物车
     *
*/

    @RequestMapping("/emptyCart")
    public void emptyCart(){
        //获取已登录的用户信息
        int userId=100;
        String key=REDIS_CART+userId;
        try {
            jedisClient.del(key);
        } catch (Exception e) {
            e.printStackTrace();
            throw new BusinessException(ErrorCode.SYSTEM_ERROR,"清空购物车的过程发生异常");
        }
    }



/**
     *删除已结算的购物项
     * */
/*
    @RequestMapping("/delProductByProductIds")
    @ResponseBody
    public LssgCart delProductByProductIds(@RequestParam(value="productIds[]")String[] productIds){
        //获取已登录的用户信息
        Subject subject = SecurityUtils.getSubject();
        String userLoginName = (String) subject.getPrincipal();
        LssgCart lssgCart = JSON.parseObject(jedisClient.hget(REDIS_CART,userLoginName),LssgCart.class);
        BigDecimal delTotalPrice =new BigDecimal("0.00");
        Map<String,LssgCartItem> lssgCartItemMap = lssgCart.getCartItems();
        for(String productId : productIds){
            LssgCartItem lssgCartItem = lssgCartItemMap.get(productId);
            // MySQL数据库中商品加上相对应的库存量
            delTotalPrice = delTotalPrice.add(lssgCartItem.getSubtotalPrice());
            //通过商品id删除该购物项
            lssgCartItemMap.remove(productId);
        }
        //更新总价 新的购物车总价 = 原来购物车总价 - 要结算购物项的小计
        lssgCart.setTotalPrice(lssgCart.getTotalPrice().subtract(delTotalPrice));
        //更新购物车到redis
        jedisClient.hset(REDIS_CART,userLoginName,JSON.toJSONString(lssgCart));
        //从redis中取出购物车传到到前台
        return JSON.parseObject(jedisClient.hget(REDIS_CART,userLoginName),LssgCart.class);

    }*/



/**
     * 统计购物车中的购物项
     * */

/*
    @RequestMapping("/countCartItme")
    @ResponseBody
    public Integer countCartItme(){
        //获取已登录的用户信息
        Subject subject = SecurityUtils.getSubject();
        String userLoginName = (String) subject.getPrincipal();
        LssgCart lssgCart = JSON.parseObject(jedisClient.hget(REDIS_CART,userLoginName),LssgCart.class);
        if(lssgCart==null){
            return 0;
        }
        return lssgCart.getCartItems().size();
    }
*/




}

